#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libexif/exif-data.h>
#include <libexif/exif-tag.h>
#include <libexif/exif-utils.h>

// 创建并设置EXIF标签
static void set_exif_tag(ExifData *exif, ExifIfd ifd, ExifTag tag, const char *value) {
    ExifEntry *entry = exif_entry_new();
    exif_entry_initialize(entry, tag);
    exif_entry_set_value(entry, value);
    exif_data_add_entry(exif, entry);
    exif_entry_unref(entry);
}

// 设置GPS坐标 (度分秒格式)
static void set_gps_coordinate(ExifData *exif, ExifTag tag, double coord, const char *ref) {
    ExifEntry *entry = exif_entry_new();
    exif_entry_initialize(entry, tag);
    
    // 转换为度分秒格式
    long degrees = (long)coord;
    coord -= degrees;
    coord *= 60;
    long minutes = (long)coord;
    coord -= minutes;
    coord *= 60 * 10000;
    long seconds = (long)coord;
    
    // 格式化为EXIF GPS格式: [度, 分, 秒/10000]
    char gps_value[128];
    snprintf(gps_value, sizeof(gps_value), "%ld/1 %ld/1 %ld/10000", degrees, minutes, seconds);
    exif_entry_set_value(entry, gps_value);
    exif_data_add_entry(exif, entry);
    
    // 设置参考方向 (N/S/E/W)
    if (ref) {
        ExifEntry *ref_entry = exif_entry_new();
        exif_entry_initialize(ref_entry, (tag == EXIF_TAG_GPS_LATITUDE) ? EXIF_TAG_GPS_LATITUDE_REF : EXIF_TAG_GPS_LONGITUDE_REF);
        exif_entry_set_value(ref_entry, ref);
        exif_data_add_entry(exif, ref_entry);
        exif_entry_unref(ref_entry);
    }
    
    exif_entry_unref(entry);
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("用法: %s <输入图片> <输出图片>\n", argv[0]);
        return 1;
    }

    // 从文件读取EXIF数据，如果文件没有EXIF数据则创建新的
    ExifData *exif = exif_data_new_from_file(argv[1]);
    if (!exif) {
        exif = exif_data_new();
        exif_data_set_option(exif, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
        exif_data_set_data_type(exif, EXIF_DATA_TYPE_COMPRESSED);
    }

    // 设置基本EXIF信息
    set_exif_tag(exif, EXIF_IFD_0, EXIF_TAG_MAKE, "Canon");                  // 制造商
    set_exif_tag(exif, EXIF_IFD_0, EXIF_TAG_MODEL, "EOS R5");               // 设备型号
    set_exif_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL, "2024:05:20 14:30:45"); // 拍摄时间
    set_exif_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS, "100");    // ISO
    set_exif_tag(exif, EXIF_IFD_EXIF, EXIF_TAG_FNUMBER, "4/1");             // 光圈值 (f/4.0)

    // 设置GPS信息
    set_gps_coordinate(exif, EXIF_TAG_GPS_LATITUDE, 39.908823, "N");         // 纬度 (北纬39.908823°)
    set_gps_coordinate(exif, EXIF_TAG_GPS_LONGITUDE, 116.397470, "E");      // 经度 (东经116.397470°)
    set_exif_tag(exif, EXIF_IFD_GPS, EXIF_TAG_GPS_ALTITUDE, "50/1");         // 海拔高度 (50米)
    set_exif_tag(exif, EXIF_IFD_GPS, EXIF_TAG_GPS_ALTITUDE_REF, "0");        // 海拔参考 (0=海平面以上)
    set_exif_tag(exif, EXIF_IFD_GPS, EXIF_TAG_GPS_DATE_STAMP, "2024:05:20"); // GPS日期
    set_exif_tag(exif, EXIF_IFD_GPS, EXIF_TAG_GPS_TIME_STAMP, "14:30:45");   // GPS时间

    // 将EXIF数据保存到新文件
    unsigned char *data = NULL;
    unsigned int size = 0;
    exif_data_save_data(exif, &data, &size);

    FILE *fp = fopen(argv[2], "wb");
    if (fp) {
        // 读取原始JPEG数据
        FILE *original_fp = fopen(argv[1], "rb");
        if (original_fp) {
            fseek(original_fp, 0, SEEK_END);
            long original_size = ftell(original_fp);
            fseek(original_fp, 0, SEEK_SET);
            unsigned char *original_data = malloc(original_size);
            fread(original_data, 1, original_size, original_fp);
            fclose(original_fp);

            // 写入原始数据
            fwrite(original_data, 1, original_size, fp);
            free(original_data);
        }

        // 追加EXIF数据
        fwrite(data, 1, size, fp);
        fclose(fp);
        printf("EXIF信息已成功写入 %s\n", argv[2]);
    } else {
        printf("无法打开输出文件 %s\n", argv[2]);
    }

    free(data);
    exif_data_unref(exif);
    return 0;
}